const axios = require('axios');
const fs = require('fs');
const path = require('path');

// API基础URL
const BASE_URL = 'http://localhost:3000/api';

// 测试账号信息 - 从authController可以看出，从SQL导入的用户密码是123456
const TEST_USER = {
  username: 'admin',
  password: '123456'
};

// 存储测试结果
const testResults = {
  timestamp: new Date().toISOString(),
  results: []
};

// 记录测试结果
function recordResult(testName, success, message, data = null) {
  const result = {
    testName,
    success,
    message,
    data
  };
  testResults.results.push(result);
  console.log(`${testName}: ${success ? 'PASS' : 'FAIL'} - ${message}`);
}

// 保存测试结果到文件
function saveResults() {
  const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
  const filename = `user_test_results_${timestamp}.json`;
  fs.writeFileSync(filename, JSON.stringify(testResults, null, 2));
  console.log(`\n测试结果已保存到: ${filename}`);
}

// 主测试函数
async function runTests() {
  let token = null;
  
  try {
    console.log('开始测试用户相关接口...\n');
    
    // 1. 登录获取token
    console.log('1. 登录获取token...');
    try {
      const loginResponse = await axios.post(`${BASE_URL}/auth/login`, TEST_USER);
      if (loginResponse.data.code === 200 && loginResponse.data.data.token) {
        token = loginResponse.data.data.token;
        recordResult('登录获取token', true, '登录成功，获取到token');
      } else {
        recordResult('登录获取token', false, '登录失败，未获取到token');
        throw new Error('无法获取token，测试终止');
      }
    } catch (error) {
      recordResult('登录获取token', false, `登录失败: ${error.message}`);
      throw new Error('无法获取token，测试终止');
    }
    
    // 2. 测试获取用户信息接口
    console.log('\n2. 测试获取用户信息接口...');
    try {
      const response = await axios.get(`${BASE_URL}/users/me`, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200 && response.data.data) {
        recordResult('获取用户信息', true, '成功获取用户信息', {
          userId: response.data.data.id,
          username: response.data.data.username
        });
      } else {
        recordResult('获取用户信息', false, '获取用户信息失败');
      }
    } catch (error) {
      recordResult('获取用户信息', false, `获取失败: ${error.message}`);
    }
    
    // 3. 测试编辑用户信息接口
    console.log('\n3. 测试编辑用户信息接口...');
    try {
      const updateData = {
        bio: '这是一个测试简介',
        avatar: 'https://example.com/avatar.jpg'
      };
      
      const response = await axios.put(`${BASE_URL}/users/me`, updateData, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200) {
        recordResult('编辑用户信息', true, '成功编辑用户信息');
      } else {
        recordResult('编辑用户信息', false, '编辑用户信息失败');
      }
    } catch (error) {
      recordResult('编辑用户信息', false, `编辑失败: ${error.message}`);
    }
    
    // 4. 测试获取用户统计信息接口
    console.log('\n4. 测试获取用户统计信息接口...');
    try {
      const response = await axios.get(`${BASE_URL}/users/me/stats`, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200 && response.data.data) {
        recordResult('获取用户统计信息', true, '成功获取用户统计信息', {
          likeCount: response.data.data.like_count || response.data.data.likeCount,
          followerCount: response.data.data.fan_count || response.data.data.followerCount,
          videoLikeCount: response.data.data.video_like_count || response.data.data.videoLikeCount
        });
      } else {
        recordResult('获取用户统计信息', false, '获取用户统计信息失败');
      }
    } catch (error) {
      recordResult('获取用户统计信息', false, `获取失败: ${error.message}`);
    }
    
    // 5. 测试获取用户发布视频列表接口
    console.log('\n5. 测试获取用户发布视频列表接口...');
    try {
      const response = await axios.get(`${BASE_URL}/users/me/videos?page=1&pageSize=10`, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200 && response.data.data) {
        const videos = Array.isArray(response.data.data.videos) ? response.data.data.videos : [];
        recordResult('获取用户发布视频列表', true, '成功获取用户发布视频列表', {
          total: response.data.data.total || 0,
          page: response.data.data.page || 1,
          pageSize: response.data.data.pageSize || 10,
          videos: videos.length
        });
      } else {
        recordResult('获取用户发布视频列表', false, '获取用户发布视频列表失败');
      }
    } catch (error) {
      recordResult('获取用户发布视频列表', false, `获取失败: ${error.message}`);
    }
    
    // 6. 测试获取用户收藏视频列表接口
    console.log('\n6. 测试获取用户收藏视频列表接口...');
    try {
      const response = await axios.get(`${BASE_URL}/users/me/favorites?page=1&pageSize=10`, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200 && response.data.data) {
        const favorites = Array.isArray(response.data.data.favorites) ? response.data.data.favorites : [];
        recordResult('获取用户收藏视频列表', true, '成功获取用户收藏视频列表', {
          total: response.data.data.total || 0,
          page: response.data.data.page || 1,
          pageSize: response.data.data.pageSize || 10,
          favorites: favorites.length
        });
      } else {
        recordResult('获取用户收藏视频列表', false, '获取用户收藏视频列表失败');
      }
    } catch (error) {
      recordResult('获取用户收藏视频列表', false, `获取失败: ${error.message}`);
    }
    
    // 7. 测试获取用户点赞视频列表接口
    console.log('\n7. 测试获取用户点赞视频列表接口...');
    try {
      const response = await axios.get(`${BASE_URL}/users/me/likes?page=1&pageSize=10`, {
        headers: { Authorization: `Bearer ${token}` }
      });
      
      if (response.data.code === 200 && response.data.data) {
        const likes = Array.isArray(response.data.data.likes) ? response.data.data.likes : [];
        recordResult('获取用户点赞视频列表', true, '成功获取用户点赞视频列表', {
          total: response.data.data.total || 0,
          page: response.data.data.page || 1,
          pageSize: response.data.data.pageSize || 10,
          likes: likes.length
        });
      } else {
        recordResult('获取用户点赞视频列表', false, '获取用户点赞视频列表失败');
      }
    } catch (error) {
      recordResult('获取用户点赞视频列表', false, `获取失败: ${error.message}`);
    }
    
  } catch (error) {
    console.error('测试中断:', error.message);
  } finally {
    // 统计测试结果
    const totalTests = testResults.results.length;
    const passedTests = testResults.results.filter(r => r.success).length;
    const failedTests = totalTests - passedTests;
    
    console.log('\n========================================');
    console.log(`测试统计: 总计 ${totalTests}, 通过 ${passedTests}, 失败 ${failedTests}`);
    console.log('========================================');
    
    // 保存测试结果
    saveResults();
  }
}

// 运行测试
runTests();